package com.topisv.tms.service.interfacetask;

import java.util.Date;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageRequest;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;

import com.topisv.tms.entity.interfacetask.InterfaceTask;
import com.topisv.tms.entity.interfacetask.InterfaceTaskEnum;
import com.topisv.tms.repository.task.interfacetask.InterfaceTaskDao;
import com.topisv.tms.service.base.BaseService;

/**
 * 接口任务
 * 
 * @author <a href="mailto:yuanlianghe@nryuncang.com">yuanlianghe</a>
 */
@Component
public class InterfaceTaskService extends BaseService {

    @Autowired
    private InterfaceTaskDao taskDao;
    
    @Transactional
    public void saveTask(InterfaceTask task) {
        taskDao.save(task);
    }
    
    
    
    /**
     * 锁定任务
     * 
     * @param node 节点
     * @param type 任务类型
     * @param status 任务状态
     * @param maxRows 最大行数
     * @return affected rows
     */
    @Transactional
    public int lockTask(String node, String status, int maxRows) {
        return taskDao.lockTask(node, status, maxRows);
    }
    
    
    /**
     * 查看指定任务是否已处理
     * 
     * @param taskId
     * @return 是否已处理
     */
    public boolean findIfProcessed(Long taskId) {
        long cnt = taskDao.countNotProcess(taskId, InterfaceTaskEnum.STATUS_READY);
        return cnt == 1l ? false : true;
    }
    
    /**
     * 查找需要处理的任务
     * 
     * @param status 任务状态, should be 'READY' or ('ERROR' AND retryTimes<n)
     * @param node 分片节点
     * @param retryTimes 尝试次数
     * @param maxRows 最大结果集
     * @return 任务集合
     */
    @Transactional
    public List<InterfaceTask> findTask(String status, String node, int retryTimes, int maxRows) {
        return taskDao.queryTask(status, node, retryTimes, new PageRequest(0, maxRows)).getContent();
    }
    
    /**
     * 更新任务状态
     * <p>注：参数：<code>retryTimes</code>一般来说应该传值为1。
     * 
     * @param id 任务ID
     * @param status 任务状态
     * @param errorWho 错误归属方
     * @param errorMsg 错误消息
     * @param updatedTime 更新时间
     * @param retryTimes 本次尝试次数
     * @return affected rows
     */
    @Transactional
    public int updateTask(Long id, String status, String errorWho, String errorMsg, Date updatedTime, int retryTimes) {
        return taskDao.updateTask(id, status, errorWho, errorMsg, updatedTime, retryTimes);
    }
}
